﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;

namespace ElevenGUI
{
    public partial class FrmCategorias : Form
    {

        private DataTable dtCategorias;
        private DataTable dtSubcatCategorias;
        private DataTable dtSubcategorias;

        public FrmCategorias()
        {
            InitializeComponent();
        }

        private void FrmCategorias_Load(object sender, EventArgs e)
        {
            cargarListaCategorias();
            cargarSubcatCatCombo();
            cargarListaSubcategorias();
        }

        private void cargarListaCategorias() {
            dtCategorias = SCMCategoria.consultar();
            lstCat.DataSource = dtCategorias;
            lstCat.DisplayMember = "Nombre";
            lstCat.ValueMember = "IdCategoria";
        }

        private void cargarSubcatCatCombo() {
            dtSubcatCategorias = SCMCategoria.consultar();
            cbSubcatCat.DataSource = dtSubcatCategorias;
            cbSubcatCat.DisplayMember = "Nombre";
            cbSubcatCat.ValueMember = "IdCategoria";
        }

        private void cargarListaSubcategorias() {
            try
            {
                txtNombreSubcat.Text = "";
                txtDescSubcat.Text = "";
                dtSubcategorias = SCMSubcategoria.consultar(int.Parse(cbSubcatCat.SelectedValue.ToString()));
                lstSubcat.DataSource = dtSubcategorias;
                lstSubcat.DisplayMember = "Nombre";
                lstSubcat.ValueMember = "IdSubcategoria";
            }
            catch (FormatException) { }
        }

        private void cargarCategoriasCombo() {
            dtCategorias = SCMCategoria.consultar();
            cbSubcatCat.DataSource = dtCategorias;
            cbSubcatCat.DisplayMember = "Nombre";
            cbSubcatCat.ValueMember = "IdCategoria";
        }

        private void btnNuevaSubcat_Click(object sender, EventArgs e)
        {
            txtNombreSubcat.Text = "";
            txtDescSubcat.Text = "";
            txtNombreSubcat.Enabled = true;
            txtDescSubcat.Enabled = true;
            txtNombreSubcat.Focus();
            lstSubcat.Enabled = false;
            btnNuevaSubcat.Enabled = false;
            btnEliminarSubcat.Enabled = false;
            btnCancelarSubcat.Enabled = true;
        }

        private void btnNuevaCat_Click(object sender, EventArgs e)
        {
            txtNombreCat.Text = "";
            txtDescCat.Text = "";
            txtNombreCat.Enabled = true;
            txtDescCat.Enabled = true;
            txtNombreCat.Focus();
            lstCat.Enabled = false;
            btnNuevaCat.Enabled = false;
            btnEliminarCat.Enabled = false;
            btnCancelarCat.Enabled = true;
        }

        private void btnCancelarCat_Click(object sender, EventArgs e)
        {
            txtNombreCat.Enabled = false;
            txtDescCat.Enabled = false;
            txtNombreCat.Text = "";
            txtDescCat.Text = "";
            lstCat.Enabled = true;
            btnNuevaCat.Enabled = true;
            btnEliminarCat.Enabled = true;
            btnCancelarCat.Enabled = false;
        }

        private void btnCancelarSubcat_Click(object sender, EventArgs e)
        {
            txtNombreSubcat.Enabled = false;
            txtDescSubcat.Enabled = false;
            txtNombreSubcat.Text = "";
            txtDescSubcat.Text = "";
            lstSubcat.Enabled = true;
            btnNuevaSubcat.Enabled = true;
            btnEliminarSubcat.Enabled = true;
            btnCancelarSubcat.Enabled = false;
        }

        private void btnGuardarCat_Click(object sender, EventArgs e)
        {
            if (lstCat.Enabled)
            {
                try
                {
                    DataRowView dr = (DataRowView)(lstCat.SelectedItem);
                    SCMCategoria cat = new SCMCategoria(int.Parse(dr["IdCategoria"].ToString()), txtNombreCat.Text, txtDescCat.Text);
                    cat.modificar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Categoría actualizada con éxito");
                    mensaje.ShowDialog();
                    cargarListaCategorias();
                    cargarCategoriasCombo();
                }
                catch (NullReferenceException)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Para actualizar una categoría debe elegir una de la lista de paises a la izquierda.\n Si desea crear una nueva de click en el botón \"Nueva\". ", "NullReferenceException");
                    error.ShowDialog();
                }
                catch (ValidadorException)
                {
                    if (String.IsNullOrEmpty(txtNombreCat.Text))
                    {
                        GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe ingresar el nombre de la categoría.", "ValidadorException");
                        error.ShowDialog();
                    }
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
            else
            {
                try
                {
                    SCMCategoria cat = new SCMCategoria(0, txtNombreCat.Text, txtDescCat.Text);
                    cat.insertar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Categoría insertada con éxito");
                    mensaje.ShowDialog();
                    btnCancelarCat.PerformClick();
                    cargarListaCategorias();
                    cargarCategoriasCombo();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
        }

        private void lstCat_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DataRowView dr = (DataRowView)(lstCat.SelectedItem);
                txtNombreCat.Enabled = true;
                txtDescCat.Enabled = true;
                txtNombreCat.Text = dr["Nombre"].ToString();
                txtDescCat.Text = dr["Descripcion"].ToString();
            }
            catch (NullReferenceException) { }
        }

        private void lstSubcat_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                DataRowView dr = (DataRowView)(lstSubcat.SelectedItem);
                txtNombreSubcat.Enabled = true;
                txtDescSubcat.Enabled = true;
                txtNombreSubcat.Text = dr["Nombre"].ToString();
                txtDescSubcat.Text = dr["Descripcion"].ToString();
            }
            catch (NullReferenceException) { }
        }

        private void cbSubcatCat_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!cbxEditarSubcat.Checked)
            {
                cargarListaSubcategorias();
            }
        }

        private void btnEliminarCat_Click(object sender, EventArgs e)
        {
            try
            {
                DataRowView dr = (DataRowView)(lstCat.SelectedItem);
                SCMCategoria cat = new SCMCategoria(int.Parse(dr["IdCategoria"].ToString()), "N", "N");
                bool eliminado = cat.eliminar();
                if (eliminado)
                {
                    txtNombreCat.Enabled = false;
                    txtDescCat.Enabled = false;
                    txtNombreCat.Text = "";
                    txtDescCat.Text = "";
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado la categoría");
                    mensaje.ShowDialog();
                }
                else
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("No es posible eliminar la categoría porque tiene subcategorías asociadas");
                    mensaje.ShowDialog();
                }
                cargarListaCategorias();
                cargarCategoriasCombo();
            }
            catch (NullReferenceException)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe elegir la categoría de la lista a la izquierda para eliminarla", "NullReferenceException");
                error.ShowDialog();
            }
            catch (SqlException se)
            {
                GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                error.ShowDialog();
            }
        }

        private void btnGuardarSubcat_Click(object sender, EventArgs e)
        {
            if (lstSubcat.Enabled)
            {
                try
                {
                    DataRowView dr = (DataRowView)(lstSubcat.SelectedItem);
                    DataRowView dr2 = (DataRowView)(cbSubcatCat.SelectedItem);
                    SCMSubcategoria scat = new SCMSubcategoria(int.Parse(dr["IdSubcategoria"].ToString()), int.Parse(dr2["IdCategoria"].ToString()), txtNombreSubcat.Text, txtDescSubcat.Text);
                    scat.modificar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Subcategoría actualizada con éxito");
                    mensaje.ShowDialog();
                    cargarListaSubcategorias();
                }
                catch (NullReferenceException)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Para actualizar la subcategoría debe elegir una de la lista de subcategorías a la izquierda.\n Si desea crear una nueva de click en el botón \"Nueva\". ", "NullReferenceException");
                    error.ShowDialog();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
            else
            {
                try
                {
                    SCMSubcategoria scat = new SCMSubcategoria(0, int.Parse(cbSubcatCat.SelectedValue.ToString()), txtNombreSubcat.Text, txtDescSubcat.Text);
                    scat.insertar();
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Subcategoría insertada con éxito");
                    mensaje.ShowDialog();
                    btnCancelarSubcat.PerformClick();
                    cargarListaSubcategorias();
                }
                catch (ValidadorException ve)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", ve.Message, "ValidadorException");
                    error.ShowDialog();
                }
                catch (NullReferenceException)
                {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe escoger categoría.", "NullReferenceException");
                    error.ShowDialog();
                }
                catch (SqlException se)
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                    error.ShowDialog();
                }
            }
        }

        private void btnEliminarSubcat_Click(object sender, EventArgs e)
        {
            try
            {
                DataRowView dr = (DataRowView)(lstSubcat.SelectedItem);
                SCMSubcategoria scat = new SCMSubcategoria(int.Parse(dr["IdSubcategoria"].ToString()), 0, "N", "N");
                if (scat.eliminar())
                {
                    txtNombreSubcat.Enabled = false;
                    txtDescSubcat.Enabled = false;
                    txtNombreSubcat.Text = "";
                    txtDescSubcat.Text = "";
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado la subcategoría");
                    mensaje.ShowDialog();
                }
                else
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("No es posible eliminar la subcategoría porque tiene productos asociados");
                    mensaje.ShowDialog();
                }
                cargarListaSubcategorias();
            }
            catch (NullReferenceException)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe elegir una subcategoría de la lista a la izquierda para eliminarla", "NullReferenceException");
                error.ShowDialog();
            }
            catch (SqlException se)
            {
                GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", se.Message, "SqlException");
                error.ShowDialog();
            }
        }

    }
}
